/*
 * dos2unix.c
 */

#include <unistd.h>
#include <stdio.h>
#include <getopt.h>
#include <string.h>

static const char barraN = '\n';
static const char barraR = '\r';

void dos2unix(FILE* input, FILE* output, FILE* error)
{
	//Traspaso de archivos
	int caracter = fgetc(input);
	if (ferror (input)){
		fprintf(error, "No se pudo leer del archivo de entrada\n");
		return;
	}
	int caracterAuxiliar = '\0';
	while(caracter != EOF){
		if(caracter == barraR){
			caracterAuxiliar = fgetc(input);
			if (ferror (input)){
				fprintf(error, "No se pudo leer del archivo de entrada\n");
				return;
			}
			if(caracterAuxiliar == barraN){
				fputc((int) caracterAuxiliar, output);
				if (ferror (output)){
					fprintf(error, "No se pudo escribir en el archivo de salida\n");
					return;
				}
			}else {
				fputc((int) caracter, output);
				if (ferror (output)){
					fprintf(error, "No se pudo escribir en el archivo de salida\n");
					return;
				}
				if (caracterAuxiliar != EOF)
					fputc((int) caracterAuxiliar, output);
				if (ferror (output)){
					fprintf(error, "No se pudo escribir en el archivo de salida\n");
					return;
				}
			}
		}
		else if (caracter != EOF)
		{
			fputc((int) caracter, output);
			if (ferror (output)){
				fprintf(error, "No se pudo escribir en el archivo de salida\n");
				return;
			}

		}
		caracter = fgetc(input);
		if (ferror (input)){
			fprintf(error, "No se pudo leer del archivo de entrada\n");
			return;
		}
	}
}


int main(int argc, char **argv)
{
	FILE* inputFile = stdin;
	FILE* outputFile = stdout;
	FILE* errorFile = stderr;

	int op = getopt(argc, argv, ":i:o:");
	int exit = 0;

	while(op != -1){
		switch(op)
		{
		case 'i':
			if (strcmp(optarg, "-"))
				inputFile = fopen(optarg, "rt");
			break;
		case 'o':
			if (strcmp(optarg, "-"))
				outputFile = fopen(optarg, "wt");
			break;
		case '?':
			exit = 1;
			break;
		}
		op = getopt(argc, argv, ":i:o:");
	}

	if(!inputFile){
		fprintf(errorFile, "No se pudo abrir el archivo de entrada.");
		if (outputFile)
			fclose(outputFile);
		return -1;
	}

	if(!outputFile){
		fprintf(errorFile, "No se pudo abrir el archivo de salida.");
		if (inputFile)
			fclose(inputFile);
		return -1;
	}

	if (exit)
	{
		fprintf(errorFile,"No se ingresaron los parametros de entrada correctamente. \n");
	}
	else
	{
		dos2unix(inputFile, outputFile, errorFile);
	}

	fclose(inputFile);
	fclose(outputFile);

	return 0;
}

